//
//  iMBiPhoneParser.m
//  iMediaBrowse
//
//  Created by Eberhard Rensch on 14.08.08.
//  Copyright 2008 Pleasant Software. All rights reserved.
//
// Plugin for iMedia Browser
//
// iMedia Browser is based on code originally developed by Jason Terhorst,
// further developed for Sandvox by Greg Hulands, Dan Wood, and Terrence Talbot.
// Contributions have also been made by Matt Gough, Martin Wennerberg and others
// as indicated in source files.
// 
// The iMedia Browser Framework is licensed under the following terms:
// 
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in all or substantial portions of the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the following
// conditions:
// 
//	Redistributions of source code must retain the original terms stated here,
//	including this list of conditions, the disclaimer noted below, and the
//	following copyright notice: Copyright (c) 2008 by Pleasant Software
// 
//	Redistributions in binary form must include, in an end-user-visible manner,
//	e.g., About window, Acknowledgments window, or similar, the original
//	terms stated here, including this list of conditions, the disclaimer noted
//	below, and the aforementioned copyright notice.
// 
//	Neither the name of Pleasant Software, nor the names of
//	contributors to iMedia Browser may be used to endorse or promote products
//	derived from the Software without prior and express written permission from
//	Pleasant Software or individual contributors, as appropriate.
// 
// Disclaimer: THE SOFTWARE IS PROVIDED BY THE COPYRIGHT OWNER AND CONTRIBUTORS
// "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
// AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER LIABILITY, WHETHER IN AN ACTION OF
// CONTRACT, TORT, OR OTHERWISE, ARISING FROM, OUT OF, OR IN CONNECTION WITH, THE
// SOFTWARE OR THE USE OF, OR OTHER DEALINGS IN, THE SOFTWARE.
//

#import "iMBiPhoneParser.h"
#import <iMediaBrowser/iMBLibraryNode.h>
#import <iMediaBrowser/iMediaConfiguration.h>
#import "iMBiPhoneView.h"

@implementation iMBiPhoneParser
+ (void)load
{
	NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

	[iMediaConfiguration registerParser:[self class] forMediaType:@"iPhone"];

	[pool release];
}

- (id)init
{
	if (self = [super initWithContentsOfFile:nil])
	{
		
	}
	return self;
}

- (void)fillLibraryNode:(iMBLibraryNode *)node withContent:(NSArray*)content
{
	NSEnumerator* contentEnum = [content objectEnumerator];
	NSDictionary* cursor;
	NSMutableArray *files = [NSMutableArray array];
	while(cursor = [contentEnum nextObject])
	{
		NSString* name = [cursor objectForKey:@"displayName"];
		if(name)
		{
			NSString* uuid = [cursor objectForKey:@"uuid"];
			NSArray* subcontent = [cursor objectForKey:@"content"];
			id embeddedData = [cursor objectForKey:@"embeddedData"];
			NSString* promissedFile = [cursor objectForKey:@"promissedFile"];
			NSData* iconData = [cursor objectForKey:@"iconData"];
			NSImage* icon = nil;
			if(iconData)
				icon = [[[NSImage alloc] initWithData:iconData] autorelease];
			else if([[cursor objectForKey:@"useParentIcon"] boolValue])
				icon = [node icon];
				
			if(subcontent)
			{
				iMBLibraryNode *subNode = [[[iMBLibraryNode alloc] init] autorelease];
				[subNode setName:name];
				if(icon)
					[subNode setIcon:icon];
				[node addItem:subNode];
				[self fillLibraryNode:subNode withContent:subcontent];
			}
			else if(uuid)
			{
				NSMutableDictionary *fileRecord = [NSMutableDictionary dictionary];
				id nameWithIcon = [self name:name withImage:icon];
				[fileRecord setObject:nameWithIcon forKey:@"NameWithIcon"];
				[fileRecord setObject:uuid forKey:@"uuid"];
				if(embeddedData)
					[fileRecord setObject:embeddedData forKey:@"embeddedData"];
				if(promissedFile)
					[fileRecord setObject:promissedFile forKey:@"promissedFile"];
				[files addObject:fileRecord];
			}
		}
	}
	[node setAttribute:files forKey:@"Files"];
}

- (iMBLibraryNode *)recursivelyParseDevices:(NSDictionary *)deviceDescription
{
	iMBLibraryNode *parsed = [[[iMBLibraryNode alloc] init] autorelease];
	
	NSNetService* device = [deviceDescription objectForKey:@"netService"];
	[parsed setName:[device name]];
	[parsed setAttribute:device forKey:@"device"];
	[parsed setAttribute:[NSNumber numberWithBool:YES] forKey:@"deviceEntry"];
		
	NSArray* content = [deviceDescription objectForKey:@"content"];
	if(content)
	{
		NSImage* image = [NSImage imageNamed:@"iPOn"];
		[parsed setIcon:image];
		[self fillLibraryNode:parsed withContent:content];
	}
	else
	{
		NSImage* image = [NSImage imageNamed:@"iPOff"];
		[parsed setIcon:image];
	}
		
	return parsed;
}

- (NSArray *)nodesFromParsingDatabase:(NSLock *)gate
{
	NSMutableArray* devices = [iMBiPhoneView iMediaServerDevices];
	NSMutableArray* deviceNodes = [NSMutableArray arrayWithCapacity:[devices count]];
	
	NSEnumerator *deviceEnum = [devices objectEnumerator];
	NSDictionary *cur;
	while (cur = [deviceEnum nextObject])
	{
		iMBLibraryNode *deviceNode = [self recursivelyParseDevices:cur];
		if (deviceNode)
		{
			[deviceNodes addObject:deviceNode];
		}
	}
	return deviceNodes;
}

@end
